//#define _CRT_SECURE_NO_WARNINGS 1
//
//#include"Heap.h"
//
//void HeapCreate(Heap* hp, HPDataType* a, int n)
//{
//	assert(hp);
//	HPDataType* tmp = (HPDataType*)malloc(n * sizeof(HPDataType));
//	if (tmp == NULL)
//	{
//		perror("malloc fail");
//		exit(1);
//	}
//	hp->_a = tmp;
//	hp->_capacity = hp->_size = n;
//
//	for (int i = 0;i < n; ++i)
//	{
//		hp->_a[i] = a[i];
//		AdjustUp(hp->_a, i);
//	}
//
//}
//
//void Swap(HPDataType* a, HPDataType* b)
//{
//	HPDataType tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//
//void AdjustDown(HPDataType* a, int n,int size)
//{
//	int child = 2 * n + 1;
//	while (child < size)
//	{
//		if (child + 1 < size && child < child + 1)
//		{
//			child = child + 1;
//		}
//		if ( a[child] > a[n])
//		{
//			Swap(&a[child], &a[n]);
//		}
//		child = 2 * child + 1;
//	}
//}
//
//void AdjustUp(HPDataType* a, int n)
//{
//	int parent = (n - 1) / 2;
//	while (parent >= 0)
//	{
//		if (a[n] > a[parent])
//		{
//			Swap(&a[n], &a[parent]);
//			n = parent;
//			parent = (parent - 1) / 2;
//		}
//		else
//		{
//			break;
//		}
//	}
//}
//
//void HeapDestory(Heap* hp)
//{
//	assert(hp);
//	free(hp->_a);
//	hp->_capacity = hp->_size = 0;
//}
//
//void HeapPush(Heap* hp, HPDataType x)
//{
//	assert(hp);
//	if (hp->_capacity == hp->_size)
//	{
//		HPDataType* tmp = (HPDataType*)realloc(hp->_a, 2 * hp->_capacity * sizeof(HPDataType));
//		if (tmp == NULL)
//		{
//			perror("realloc fail");
//			exit(1);
//		}
//		hp->_a = tmp;
//		hp->_capacity = 2 * hp->_capacity;
//	}
//	hp->_a[hp->_size++] = x;
//	AdjustUp(hp->_a, hp->_size - 1);
//}
//
//void HeapPop(Heap* hp)
//{
//	assert(hp);
//	assert(hp->_a);
//	Swap(&(hp->_a[0]), &(hp->_a[--(hp->_size)]));
//	AdjustDown(hp->_a, 0, hp->_size);	
//}
//
//HPDataType HeapTop(Heap* hp)
//{
//	assert(hp);
//	return hp->_a[0];
//}
//
//int HeapSize(Heap* hp)
//{
//	assert(hp);
//	return hp->_size;
//}
//
//int HeapEmpty(Heap* hp)
//{
//	return !(hp->_size);
//}